Firebird INNER JOIN

Otázka od: Radim Hradecky

2. 10. 2004 9:58

Ahoj,

            Prevadim svou aplikaci z mysql na Firebird a pri prevodu dotazu
obsahujici INNER JOIN sem narazil na problem. Firebird tvrdosijne vraci ze
sloupec neexistuje. Pouzivam Firebird 1.5 SQL dialect 3

 

V principu chci vybrat vsechny uzivatele z users kteri maji vice nez 0
volnych minut a pomoci JOINU z trzby zjistit, kdy platili naposledy (neboli
najit posledni zaznam, obsahujici jejich ID). Doufam ze sem to napsal
srozumitelne.

 

 

Struktura tabulky "trzba":

ID, primarni klic, auto increment (pres generator)

User_ID, int

Datum, timestamp

 

Struktura tabulky "users"

ID, primarni klic, auto increment (pres generator)

Volneminuty, int

 

 

Dotaz vypada takto:

SELECT u.Id,u.Volneminuty,t.Datum FROM "users" u INNER JOIN "trzba" t ON
u.ID=t.User_ID WHERE Volneminuty > 0 Group By u.Id,u.volneminuty

 

Firebird tvrdosijne hlasi ze t.User_ID neexistuje. Velka a mala pismena mam
v poradku, na mysql to fungovalo. Kde je prosim problem?

Dekuji za pomoc

 

S pozdravem Radim Hradecky
 
 


Odpovedá: Pavel Cisar

2. 10. 2004 11:49

Haj hou!

On 2 Oct 2004 at 10:57, Radim Hradecky wrote:

> Struktura tabulky "trzba":
>
> ID, primarni klic, auto increment (pres generator)
> User_ID, int
> Datum, timestamp
>
> Struktura tabulky "users"
> ID, primarni klic, auto increment (pres generator)
> Volneminuty, int
>
> Dotaz vypada takto:
>
> SELECT u.Id,u.Volneminuty,t.Datum FROM "users" u INNER JOIN "trzba" t ON
> u.ID=t.User_ID WHERE Volneminuty > 0 Group By u.Id,u.volneminuty
>
> Firebird tvrdosijne hlasi ze t.User_ID neexistuje. Velka a mala
> pismena mam v poradku, na mysql to fungovalo. Kde je prosim problem?

A ja bych se vsadil, ze nemas   Pokud je deklarace tabulky takova
jak pises, tedy s User_ID, pak se na nej musis odkazovat jako na
"User_ID" (v uvozovkach).

S pozdravem
Pavel Cisar ( ICQ: 89017288)
Mobil: 724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase


Odpovedá: Radim Hradecky

2. 10. 2004 13:00

>> Struktura tabulky "trzba":
>>
>> ID, primarni klic, auto increment (pres generator)
>> User_ID, int
>> Datum, timestamp
>>
>> Struktura tabulky "users"
>> ID, primarni klic, auto increment (pres generator)
>> Volneminuty, int
>>
>> Dotaz vypada takto:
>>
>> SELECT u.Id,u.Volneminuty,t.Datum FROM "users" u INNER JOIN "trzba" t ON
>> u.ID=t.User_ID WHERE Volneminuty > 0 Group By u.Id,u.volneminuty
>>
>> Firebird tvrdosijne hlasi ze t.User_ID neexistuje. Velka a mala
>> pismena mam v poradku, na mysql to fungovalo. Kde je prosim problem?

>A ja bych se vsadil, ze nemas   Pokud je deklarace tabulky takova
>jak pises, tedy s User_ID, pak se na nej musis odkazovat jako na
>"User_ID" (v uvozovkach).

Tak za to mohli ty uvozovky a zaroven tam bylo chyba i ve velkem a malem
(bohuzel sem vzdy zkousel bud jedno nebo druhe, ne oboje najednou). Bohuzel
stale to jeste neni jak si Firebird preje. Momentalne mam:

SELECT u."ID",u."Volneminuty",t."Datum" FROM "users" u
INNER JOIN "trzba" t ON u."ID"=t."User_ID" WHERE
 "Volneminuty" > 0 Group By u."ID",u."Volneminuty"

Pricemz to hlasi:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate
function or the GROUP BY clause).

Chyba je v tom GROUP BY, pokud to dam pryc jde to. Chce to po mne dat tam i
to "Datum",cimz ale ten group by ztraci vyznam, protoze to je pokazde
jine....


Odpovedá: Tomas Stejskal

3. 10. 2004 9:47

Radim Hradecky wrote:

>>>Struktura tabulky "trzba":
>>>
>>>ID, primarni klic, auto increment (pres generator)
>>>User_ID, int
>>>Datum, timestamp
>>>
>>>Struktura tabulky "users"
>>>ID, primarni klic, auto increment (pres generator)
>>>Volneminuty, int
>>>
>>>Dotaz vypada takto:
>>>
>>>SELECT u.Id,u.Volneminuty,t.Datum FROM "users" u INNER JOIN "trzba" t ON
>>>u.ID=t.User_ID WHERE Volneminuty > 0 Group By u.Id,u.volneminuty
>>>
>>>Firebird tvrdosijne hlasi ze t.User_ID neexistuje. Velka a mala
>>>pismena mam v poradku, na mysql to fungovalo. Kde je prosim problem?
>>>
>>>
>
>
>
>>A ja bych se vsadil, ze nemas   Pokud je deklarace tabulky takova
>>jak pises, tedy s User_ID, pak se na nej musis odkazovat jako na
>>"User_ID" (v uvozovkach).
>>
>>
>
>Tak za to mohli ty uvozovky a zaroven tam bylo chyba i ve velkem a malem
>(bohuzel sem vzdy zkousel bud jedno nebo druhe, ne oboje najednou). Bohuzel
>stale to jeste neni jak si Firebird preje. Momentalne mam:
>
>SELECT u."ID",u."Volneminuty",t."Datum" FROM "users" u
>INNER JOIN "trzba" t ON u."ID"=t."User_ID" WHERE
> "Volneminuty" > 0 Group By u."ID",u."Volneminuty"
>
>Pricemz to hlasi:
>Invalid token.
>Dynamic SQL Error.
>SQL error code = -104.
>Invalid expression in the select list (not contained in either an aggregate
>function or the GROUP BY clause).
>
>Chyba je v tom GROUP BY, pokud to dam pryc jde to. Chce to po mne dat tam i
>to "Datum",cimz ale ten group by ztraci vyznam, protoze to je pokazde
>jine....
>
>
>
>
>
Stacila by drobna uprava:

SELECT u."ID",u."Volneminuty", MAX(t."Datum") FROM "users" u
INNER JOIN "trzba" t ON u."ID"=t."User_ID" WHERE
 "Volneminuty" > 0 Group By u."ID",u."Volneminuty"

prip. upravit dotaz bez groupovani:

SELECT
  u."ID",
  u."Volneminuty",
  (SELECT MAX(t."Datum") FROM "trzba" t WHERE t."User_ID" = u."ID") as Datum
FROM "users" u
WHERE u."Volneminuty" > 0

Jinak bych doporucoval nepouzivat v CREATE TABLE pro nazvy fieldu uvozovky.

S pozdravem

Tomas Stejskal
Aktis, a. s.


Odpovedá: petr palicka

4. 10. 2004 6:56

> SELECT u."ID",u."Volneminuty",t."Datum" FROM "users" u
> INNER JOIN "trzba" t ON u."ID"=t."User_ID" WHERE
> "Volneminuty" > 0 Group By u."ID",u."Volneminuty"

Myslim, ze uz drive jsi psal ze chces posledni datum, potom musis v
dotazu mit max(t."Datum").
Nebo si lepe rozmysli, co vlastne z toho dotazu chces.

Peca